/**
 *   DataSlim - Lazy Loading Framework
 *   Copyright (C) 2007 Rodolfo Dias
 *   
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License along
 *   with this program; if not, write to the Free Software Foundation, Inc.,
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 
 */

package net.dataslim.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * (ProxiedLazy)
 * Annotation responsavel por informar que o metodo
 * anotado possui o fetch Lazy 
 * Este annotation possui informacoes que indicam
 * como o <class>DataSlim pode recuperar os dados 
 * do relacionamento.
 * 
 * param mappedBy indica o nome do metodo que retorna a associacao
 * param jndiName O endereco jndi para recuperar o objeto que possui 
 *                o metodo que retorna a associacao
 * param className  Nome completo da classe factory que disponibiliza
 *                    o metodo definido em factoryMethod que retorna o 
 *                    objeto que possui o metodo que retorna a associacao
 * param factoryMethod Nome do metodo que retorna o objeto que possui
 *                     o metodo que retorna a associacao
 * param parameters Nome dos parametros existentes na classe real que devem
 *                  ser usados para puxar a associacao, caso seja passado um valor
 *                  cujo nome seja iniciado com CONST_ por exemplo CONST_1234, o valor
 *                  1234 ex: parameter({"CONST_123","id","code"})
 *                  Neste caso o metodo vai receber como parametro
 *                  <Metodo>(123, this.getId(), this.getCode());
 *                  
 *             
 *    
 * Os parametros jndiName pode ou nao existir de acordo com existencia
 * dos parametros (factoryClass e factoryMethod), pois atraves do jndiName
 * eh possivel recuperar diretamente o objeto que possue o metodo mappedBy
 * sem precisar recorrer a factory.
 * 
 *   
 * Para simplificar vamos dar um exemplo de implementacao
 *  
 *	@DataSlimLazy(mappedBy="getDetailsByMaster",
 *		     className="net.dataslim.test.ComponentFacadeFactory",
 *		     factoryMethod="getComponentQueryFacade",
 *		     parameters={"id"})
 *  Aqui estamo indicando que ComponentFacadeFactory.getComponentQueryFacade retorna um objeto
 *  que possui um metodo que esta mapeado pelo annotation DataSlimFind(key=getDetailsByMaster)
 *  e que a execucao deste metodo precisa do parametro id existentes na classe
 *  proxiada.
 * 
 *  
 * @author rdias
 *
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD})
@Inherited
public @interface DataSlimLazy {
	String mappedBy() default "";
	String jndiName() default "";
	String className() default "";
	String factoryMethod() default "";
	String[] parameters();
}
